home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Think Class Libraries / Item Class / Item sources / CItem.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-30  |  5.4 KB  |  361 lines  |  [TEXT/KAHL]

  1. /*
  2.  * File:        CItem.c
  3.  * Created:        7/25/93
  4.  * Desc:        An item that can be displayed in an ItemTable Pane.
  5.  *                The item keeps a reference to its parent (the root
  6.  *                objects parent is NULL), and a reference to each
  7.  *                of its children (subItems).
  8.  *
  9.  * Superclass:    CObject.
  10.  * Uses:        <NONE>.
  11.  * Original Author:    Atul Barve
  12.  * Modifications:    W. Wesley Monroe
  13.  *
  14.  * Copyright © 1993 Animas Software Production. All rights reserved.
  15.  */
  16.  
  17. #include    <string.h>
  18.  
  19. #include    "CItem.h"
  20.  
  21. void    CItem::IItem(void)
  22. {
  23.     fSubItems = 0;
  24.     fExpanded = 0;
  25.     fLevel = 0;
  26.     fText = 0;
  27.     fParent = 0L;
  28. }
  29.  
  30. void    CItem::INewRootItem(short canExpand, short iconID, short expanded,
  31.                            StringPtr text)
  32. {
  33.     short    sLen;
  34.     char    *txt;
  35.  
  36.     fCanExpand = canExpand;
  37.     fIconID    = iconID;
  38.     fExpanded = expanded;
  39.  
  40.     sLen = text[0];
  41.     ASSERT(sLen);
  42.  
  43.     txt = (char *) NewPtr(sLen + 1);
  44.     fText = txt;
  45.     memcpy(txt, text, sLen + 1);
  46.  
  47.     fParent = 0L;
  48.     fSubItems = 0L;
  49.     fLevel = 0;
  50. }
  51.  
  52. void    CItem::Dispose(void)
  53. {
  54.     if(fSubItems)
  55.         fSubItems->DisposeAll();
  56.  
  57.     ForgetObject(fSubItems);
  58.     ForgetPtr(fText);
  59. }
  60.  
  61.  
  62. short    CItem::GetIconID(void)
  63. {
  64.     return fIconID;
  65. }
  66.  
  67. void    CItem::SetIconID(short id)
  68. {
  69.     fIconID = id;
  70. }
  71.  
  72. void    CItem::SetParent(CItem *parent)
  73. {
  74.     fParent = parent;
  75. }
  76.  
  77. CItem    *CItem::GetParent(void)
  78. {
  79.     return fParent;
  80. }
  81.  
  82. Boolean CItem::CanAccept(CList *selectedItems)
  83. {
  84.     return fCanExpand;
  85. }
  86.  
  87. void CItem::RemoveSubItem(CItem *child)
  88. {
  89.  
  90.     ASSERT(fSubItems);
  91.  
  92.     fSubItems->Remove(child);
  93.     
  94.     if(fSubItems->GetNumItems() < 1) {
  95.  
  96.         SetCanExpand(FALSE);
  97.     }
  98. }
  99.  
  100. void    CItem::GetDisplayText(char *text)
  101. {
  102.     if(fText == 0)
  103.         text[0] = 0;
  104.     else
  105.         memcpy(text,fText,fText[0] + 1);
  106. }
  107.  
  108. void    CItem::SetDisplayText(char *text)
  109. {
  110.  
  111.     if(fText)
  112.         ForgetPtr(fText);
  113.     fText = (char *) NewPtr(text[0] + 1);
  114.     memcpy(fText,text,text[0]+1);
  115. }
  116.  
  117. void    CItem::AppendSubItem(CItem *item)
  118. {
  119.     if(fSubItems == 0) {
  120.         fSubItems = new CList;
  121.         fSubItems->IList();
  122.     }
  123.  
  124.     fSubItems->Append(item);
  125.     item->SetLevel(GetLevel() + 1);
  126. }
  127.  
  128. void    CItem::GraftSubItem(CItem *item)
  129. {
  130.     if(fSubItems == 0) {
  131.         fSubItems = new CList;
  132.         fSubItems->IList();
  133.     }
  134.  
  135.     fSubItems->Append(item);
  136.     item->SetLevel(GetLevel() + 1);
  137. }
  138.  
  139. void    CItem::SetNthSubItem(CItem *item, short n)
  140. {
  141.     if(fSubItems == 0) {
  142.         fSubItems = new CList;
  143.         fSubItems->IList();
  144.     }
  145.     item->SetLevel(GetLevel() + 1);
  146.  
  147.     if(n == 0)
  148.         fSubItems->Prepend(item);
  149.     else if(n > fSubItems->GetNumItems())
  150.         fSubItems->Append(item);
  151.     else
  152.         fSubItems->InsertAt(item,n);
  153. }
  154.  
  155. short    CItem::GetLevel(void)
  156. {
  157.     return fLevel;
  158. }
  159.  
  160. void    CItem::SetLevel(short level)
  161. {
  162.     short    i,n;
  163.     CItem    *sub;
  164.     
  165.     if(fSubItems) {
  166.         n = fSubItems->GetNumItems();
  167.         for(i=1;i<=n;i++) {
  168.             sub = (CItem*) fSubItems->NthItem(i);
  169.             sub->SetLevel(level+1);
  170.         }
  171.     }
  172.     fLevel = level;    
  173. }
  174.  
  175. CItem    *CItem::GetNthSubItem(short n)
  176. {
  177.     if(fSubItems)
  178.         return (CItem*)fSubItems->NthItem(n);
  179.     return 0;
  180. }
  181.  
  182.  
  183. short    CItem::GetNumSubItems(void)
  184. {
  185.     if(fSubItems)
  186.         return fSubItems->GetNumItems();
  187.     return 0;
  188. }
  189.  
  190. short    CItem::GetExpanded(void)
  191. {
  192.     return fExpanded;
  193. }
  194.  
  195. void    CItem::SetExpanded(short flag)
  196. {
  197.     fExpanded = flag;
  198. }
  199.  
  200. void    CItem::SetCloseIconID(short id)
  201. {
  202.     fCloseIconID = id;
  203. }
  204.  
  205.  
  206. void    CItem::SetOpenIconID(short id)
  207. {
  208.     fOpenIconID = id;
  209. }
  210.  
  211.  
  212. void    CItem::SetInterimIconID(short id)
  213. {
  214.     fInterimIconID = id;
  215.  
  216. }
  217.  
  218.  
  219.  
  220. short    CItem::GetCloseIconID(void)
  221. {
  222.     return fCloseIconID;
  223. }
  224.  
  225.  
  226. short    CItem::GetOpenIconID(void)
  227. {
  228.     return fOpenIconID;
  229. }
  230.  
  231.  
  232. short    CItem::GetInterimIconID(void)
  233. {
  234.     return fInterimIconID;
  235. }
  236.  
  237. void    CItem::SetCanExpand(short flag)
  238. {
  239.     fCanExpand = flag;
  240.     
  241. }
  242.  
  243. short    CItem::GetCanExpand(void)
  244. {
  245.     return fCanExpand;
  246. }
  247.  
  248. void CItem::ReAllocSubItems(void)
  249. {
  250.     fSubItems = new CList;
  251.     fSubItems->IList();
  252. }
  253.  
  254. CItem *CItem::CopyItem(Boolean copySubItems)
  255. {
  256.     CItem *anItem;
  257.     
  258.     anItem = (CItem *) this->Copy();
  259.  
  260.     /*
  261.      * if copySubItems is true, recuresively duplicate
  262.      * the child objects.  Otherwise, lop off the subItems
  263.      * by ReAllocing the SubItems to create an empty
  264.      * subItems list.
  265.      */
  266.  
  267.     if(copySubItems) {
  268.  
  269.         long i, n;
  270.         
  271.         n = GetNumSubItems();
  272.         
  273.         for(i = 1; i <= n; i++) {
  274.  
  275.             CItem *sub;
  276.             
  277.             sub = GetNthSubItem(i);
  278.             ASSERT(sub);
  279.             sub->SetParent(anItem);
  280.             sub->CopyItem(copySubItems);
  281.         }
  282.     } else
  283.         anItem->ReAllocSubItems();
  284.  
  285.     return anItem;
  286. }
  287.  
  288. /*
  289.  * GetExtraItemData()
  290.  *
  291.  *    Subclasses can override this method to read in data
  292.  *    specific to the New Kind of Item.
  293.  *  NOTE:    This method should advance the handle past the
  294.  *            extra data that it reads.
  295.  */
  296.  
  297. void CItem::GetExtraItemData(Ptr *data)
  298. {
  299.  
  300. }
  301.  
  302. void CItem::BuildExtraItemData(Handle data)
  303. {
  304.  
  305. }
  306.  
  307. /*
  308.  * BuildRes()
  309.  *
  310.  *    Recursively build the items tree into data....
  311.  */
  312.  
  313. void CItem::BuildRes(Handle data)
  314. {
  315.     char    *text;
  316.  
  317.     long    i, n;
  318.     short    tmpS, numItems;
  319.     short    sLen;
  320.     char    dummy;
  321.  
  322.         // Copy the text into a new Even Packed Pascal String.
  323.     sLen = fText[0];
  324.     text = NewPtr(sLen + 1);
  325.     memcpy(text, fText, sLen + 1);
  326.  
  327.         // stuff all the data into the Handle
  328.     tmpS = fCanExpand;
  329.     PtrAndHand(&tmpS, data, sizeof(short));
  330.     tmpS = fExpanded;
  331.     PtrAndHand(&tmpS, data, sizeof(short));
  332.     tmpS = fIconID;
  333.     PtrAndHand(&tmpS, data, sizeof(short));
  334.     tmpS = 0;
  335.     PtrAndHand(&tmpS, data, sizeof(short));
  336.     tmpS = 0;
  337.     PtrAndHand(&tmpS, data, sizeof(short));
  338.         PtrAndHand(text, data, sLen + 1);
  339.  
  340.         // padd an even string...
  341.     if(sLen % 2 == 0)
  342.         PtrAndHand(&dummy, data, sizeof(char));
  343.  
  344.     if(fSubItems)
  345.         numItems = n = fSubItems->GetNumItems();
  346.     else
  347.         numItems = n = 0;
  348.  
  349.     BuildExtraItemData(data);
  350.  
  351.     PtrAndHand(&numItems, data, sizeof(short));
  352.  
  353.     for(i = 1; i <= n; i++) {
  354.         CItem *anItem;
  355.         
  356.         anItem = (CItem *) fSubItems->NthItem(i);
  357.         anItem->BuildRes(data);
  358.     }
  359. }
  360.  
  361.